return {
  {
    -- 多光标操作，在 V-Block 模式下，选中后 Ctrl+N 依次选中其他一致的单词
    event = { "BufReadPost", "BufNewFile" },
    'mg979/vim-visual-multi'
  },
  {
    "kylechui/nvim-surround",
    version = "*", -- Use for stability; omit to use `main` branch for the latest features
    event = { "BufReadPost", "BufNewFile" },
    config = function()
      require("nvim-surround").setup({
        -- Configuration here, or leave empty to use defaults
      })
      -- ds" 删除 "
      -- cs)] 修改)为]

      -- surr*ound_words             ysiw)           (surround_words)
      -- *make strings               ys$"            "make strings"
      -- [delete ar*ound me!]        ds]             delete around me!
      -- remove <b>HTML t*ags</b>    dst             remove HTML tags
      -- 'change quot*es'            cs'"            "change quotes"
      -- <b>or tag* types</b>        csth1<CR>       <h1>or tag types</h1>
      -- delete(functi*on calls)     dsf             function calls
    end
  },
  {
    -- 自动补全成对的符号
    event = { "BufReadPost", "BufNewFile" },
    'windwp/nvim-autopairs',
    config = function()
      -- 成对符号的补全
      require('nvim-autopairs').setup({
        disable_filetype = {
          'TelescopePrompt',
          'vim'
        },
        -- check bracket in same line
        enable_check_bracket_line = false
      })
    end
  },
  {
    event = { "BufReadPost", "BufNewFile" },
    -- 编辑器颜色值可视化颜色
    'norcalli/nvim-colorizer.lua',
    config = function()
      require('colorizer').setup()
    end
  },
  {
    event = "VeryLazy",
    'akinsho/toggleterm.nvim',
    version = '*',
    config = function()
      -- 内部打开终端
      require('toggleterm').setup({
        -- direction = 'float',
        open_mapping = [[<c-\>]]
      })
    end
  },
  {
    event = { "BufReadPost", "BufNewFile" },
    'rmagatti/alternate-toggler',
    config = function()
      -- true/false这种的快速修改
      -- ["true"] = "false",
      -- ["True"] = "False",
      -- ["TRUE"] = "FALSE",
      -- ["Yes"] = "No",
      -- ["YES"] = "NO",
      -- ["1"] = "0",
      -- ["<"] = ">",
      -- ["("] = ")",
      -- ["["] = "]",
      -- ["{"] = "}",
      -- ['"'] = "'",
      -- ['""'] = "''",
      -- ["+"] = "-",
      -- ["==="] = "!=="
      vim.keymap.set('n', '<space>ta', '<cmd>ToggleAlternate<cr>')
    end
  },
  {
    event = { "BufReadPost", "BufNewFile" },
    -- 字符串中输入 ${} 自动处理成模板字符
    'axelvc/template-string.nvim',
    config = function()
      require('template-string').setup({
        filetypes = {
          'typescript',
          'javascript',
          'typescriptreact',
          'javascriptreact',
          'python'
        },                              -- filetypes where the plugin is active
        jsx_brackets = true,            -- must add brackets to jsx attributes
        remove_template_string = false, -- remove backticks when there are no template string
        restore_quotes = {
          -- quotes used when "remove_template_string" option is enabled
          normal = [[']],
          jsx = [["]],
        },
      })
    end
  },
  {
    -- 为分割的每个 pane 窗口添加一个标识, 很奇怪没有工作
    event = "VeryLazy",
    "s1n7ax/nvim-window-picker",
    config = function()
      require('window-picker').setup({
        filter_rules = {
          -- whether you want to include the window you are currently on to window
          -- selection or not
          include_current_win = true,

          -- filter using buffer options
          bo = {
            -- if the file type is one of following, the window will be ignored
            filetype = { 'NvimTree', 'neo-tree', 'notify', "fidget" },

            -- if the file type is one of following, the window will be ignored
            -- buftype = { 'terminal' },
          },
        }
      })

      vim.keymap.set('n', "<c-w>p", function()
        local picked_window_id = require('window-picker').pick_window()
        if picked_window_id then
          vim.api.nvim_set_current_win(picked_window_id)
        end
      end, { desc = "This plugins prompts the user to pick a window and returns the window id of the picked window." })
    end
  },
  { -- 有些与之前配置的插件冲突快捷键,暂时先不改动
    -- 光标快速跳转
    "folke/flash.nvim",
    event = "VeryLazy",
    keys = {
      { "s", mode = { "n", "x", "o" }, function() require("flash").jump() end,       desc = "Flash" },
      { "S", mode = { "n", "o", "x" }, function() require("flash").treesitter() end, desc = "Flash Treesitter" },
      { "r", mode = "o",               function() require("flash").remote() end,     desc = "Remote Flash" },
      {
        "R",
        mode = { "o", "x" },
        function() require("flash").treesitter_search() end,
        desc =
        "Treesitter Search"
      },
      {
        "<C-s>",
        mode = { "c" },
        function() require("flash").toggle() end,
        desc =
        "Toggle Flash Search"
      },
    },
    config = function()
      require("flash").setup()
    end
  },
  {
    -- 记住关闭之前的窗口布局
    "folke/persistence.nvim",
    event = "VeryLazy",
    config = function()
      require("persistence").setup({
        dir = vim.fn.expand(vim.fn.stdpath("state") .. "/sessions/"), -- directory where session files are saved
      })

      local keymap = vim.api.nvim_set_keymap

      -- restore the session for the current directory
      keymap("n", "<space>ms", [[<cmd>lua require("persistence").load()<cr>]],
        { desc = "restore the session for the current directory" })

      -- restore the last session
      keymap("n", "<space>ml", [[<cmd>lua require("persistence").load({ last = true })<cr>]], {
        desc = "restore the last session"
      })

      -- stop Persistence => session won't be saved on exit
      keymap("n", "<space>md", [[<cmd>lua require("persistence").stop()<cr>]], {
        desc = "stop Persistence => session won't be saved on exit"
      })

      -- 自动加载,可以不设置,手动调用
      -- vim.cmd([[lua require("persistence").load({ last = true })]])
    end
  },
}
